import PQueue from 'p-queue';

const queue = new PQueue({ concurrency: 1 });
const taskStore = new Map(); // 存储任务
let isRunning = false; // 定时器状态标志
let intervalId = null; // 保存定时器ID

// 定义任务过期时间检查函数
function isTaskExpired(task) {
    return Date.now() > task.expirationTime;
}

// 启动定时器
function startInterval() {
    if (!isRunning) {
        isRunning = true;
        intervalId = setInterval(() => {
            const now = Date.now();
            console.log(` 每秒检查一次 ==> 当前时间：${now}`)
            for (const [id, task] of taskStore) {
                if (isTaskExpired(task)) {
                    // console.log(`任务 ${id} 已过期。`);
                    taskStore.delete(id);
                }
            }
            if (taskStore.size === 0) {
                stopInterval(); // 队列为空时停止定时器
            }
        }, 1000); // 每秒检查一次
    }
}

// 停止定时器
function stopInterval() {
    if (isRunning && intervalId !== null) {
        clearInterval(intervalId);
        intervalId = null;
        isRunning = false;
    }
}

// 添加任务到队列
export function addTask(task, expirationTime) {
    const taskWithExpiration = {
        ...task,
        expirationTime: Date.now() + expirationTime, // 自动计算过期时间
    };

    taskStore.set(taskWithExpiration.id, taskWithExpiration);

    if (!isRunning) {
        startInterval(); // 如果定时器未启动，则启动
    }

    queue.add(() => {
        if (isTaskExpired(taskWithExpiration)) {
            // console.log(`任务 ${taskWithExpiration.id} 已过期。`);
            taskStore.delete(taskWithExpiration.id); // 删除过期任务
            return Promise.resolve(); // 任务已过期，直接完成
        }

        // 处理任务
        return new Promise((resolve) => {
            // console.log(`正在处理任务 ${taskWithExpiration.id}`);
            setTimeout(() => {
                // console.log(`任务 ${taskWithExpiration.id} 已处理。`);
                taskStore.delete(taskWithExpiration.id); // 处理完成后删除任务
                resolve();
            }, 2000); // 模拟处理时间
        });
    }).then();
}

// 获取当前队列中的任务数据
export function getQueueData() {
    return Array.from(taskStore.values());
}
